#ifndef _VECTOR_MAP_LULY_
#define _VECTOR_MAP_LULY_
#include <unordered_map>
#include <vector>
//数组列表（单向矩阵图）
//数组与列表的结合
//即可以用数字进行迭代，也可以用key获取数字
//原理是，用数组储存key，同是key也与map中的key相同
template <typename T_key, typename T_value>
class vector_map {
  std::vector<T_key> m_vetor;
  std::unordered_map<T_key, T_value> m_map;
  int size = 0;

 public:
  void push_back(T_key key, T_value value);

  //可以用key获取，也可以用index获取
  //不同的是，用index还可以获取到key
  std::pair<T_key&, T_value&> operator[](int index);
  T_value& operator[](T_key key);
  T_value& getValue(T_key key);  //同operator[](T_key key)

  bool hasKey(T_key key);
  int getSize() { return size; }
};

template <typename T_key, typename T_value>
void vector_map<T_key, T_value>::push_back(T_key key, T_value value) {
  m_vetor.push_back(key);
  m_map.insert(std::pair<T_key, T_value>(key, value));
  size += 1;
}

template <typename T_key, typename T_value>
T_value& vector_map<T_key, T_value>::operator[](T_key key) {
  return m_map[key];
}

template <typename T_key, typename T_value>
T_value& vector_map<T_key, T_value>::getValue(T_key key) {
  return m_map[key];
}

template <typename T_key, typename T_value>
std::pair<T_key&, T_value&> vector_map<T_key, T_value>::operator[](int index) {
  return std::pair<T_key&, T_value&>(m_vetor[index], m_map[m_vetor[index]]);
}

template <typename T_key, typename T_value>
bool vector_map<T_key, T_value>::hasKey(T_key key) {
  for (T_key i : m_vetor) {
    if (i == key) {
      return true;
    }
  }
  return false;
}

#endif